"""
提示词模板管理器
负责加载、存储和管理提示词模板
"""
import json
import os
from typing import Dict, Optional, Any


class PromptTemplateManager:
    """
    提示词模板管理器类
    用于管理和提供各种提示词模板
    """
    
    def __init__(self, config_path: Optional[str] = None):
        """
        初始化提示词模板管理器
        
        Args:
            config_path: 模板配置文件路径，如果为None则使用默认路径
        """
        self.config_path = config_path or os.path.join(
            os.path.dirname(os.path.dirname(os.path.dirname(__file__))),
            'config', 'prompt_templates.json'
        )
        self.templates: Dict[str, Dict[str, str]] = {}
        self.default_template: str = ""
        self._load_templates()
    
    def _load_templates(self) -> None:
        """
        从配置文件加载提示词模板
        
        Raises:
            FileNotFoundError: 如果配置文件不存在
            json.JSONDecodeError: 如果配置文件格式错误
            KeyError: 如果配置文件缺少必要的键
        """
        if not os.path.exists(self.config_path):
            raise FileNotFoundError(f"提示词模板配置文件不存在: {self.config_path}")
        
        with open(self.config_path, 'r', encoding='utf-8') as f:
            config = json.load(f)
        
        # 验证配置文件格式
        if 'templates' not in config:
            raise KeyError("配置文件缺少'templates'键")
        
        if 'default_template' not in config:
            raise KeyError("配置文件缺少'default_template'键")
        
        # 加载模板
        self.templates = config['templates']
        self.default_template = config['default_template']
        
    def get_template(self, field_name: str) -> str:
        """
        根据字段名称获取对应的提示词模板
        
        Args:
            field_name: 字段名称
            
        Returns:
            str: 提示词模板
        """
        if field_name in self.templates:
            return self.templates[field_name]['template']
        return self.default_template
    
    def has_template(self, field_name: str) -> bool:
        """
        检查是否有指定字段的模板
        
        Args:
            field_name: 字段名称
            
        Returns:
            bool: 如果有指定字段的模板则返回True，否则返回False
        """
        return field_name in self.templates
    
    def get_all_template_fields(self) -> list:
        """
        获取所有可用的模板字段名称
        
        Returns:
            list: 模板字段名称列表
        """
        return list(self.templates.keys())
    
    def update_template(self, field_name: str, template: str) -> None:
        """
        更新或添加提示词模板
        
        Args:
            field_name: 字段名称
            template: 提示词模板
        """
        self.templates[field_name] = {'template': template}
    
    def update_default_template(self, template: str) -> None:
        """
        更新默认提示词模板
        
        Args:
            template: 默认提示词模板
        """
        self.default_template = template
    
    def save_templates(self, output_path: Optional[str] = None) -> None:
        """
        保存提示词模板到配置文件
        
        Args:
            output_path: 输出文件路径，如果为None则保存到原始配置文件
        """
        save_path = output_path or self.config_path
        config = {
            'templates': self.templates,
            'default_template': self.default_template
        }
        
        with open(save_path, 'w', encoding='utf-8') as f:
            json.dump(config, f, ensure_ascii=False, indent=2)
    
    def validate_template(self, template: str, variables: Dict[str, Any]) -> bool:
        """
        验证模板是否可以被成功格式化
        
        Args:
            template: 提示词模板
            variables: 用于格式化的变量字典
            
        Returns:
            bool: 如果模板可以被成功格式化则返回True，否则返回False
        """
        try:
            template.format(**variables)
            return True
        except (KeyError, ValueError):
            return False


# 创建全局模板管理器实例，用于单例访问
_template_manager_instance: Optional[PromptTemplateManager] = None


def get_prompt_template_manager() -> PromptTemplateManager:
    """
    获取提示词模板管理器的单例实例
    
    Returns:
        PromptTemplateManager: 提示词模板管理器实例
    """
    global _template_manager_instance
    if _template_manager_instance is None:
        _template_manager_instance = PromptTemplateManager()
    return _template_manager_instance


# 测试代码
if __name__ == "__main__":
    try:
        # 创建模板管理器实例
        template_manager = PromptTemplateManager()
        
        # 测试获取模板
        print("可用的模板字段:", template_manager.get_all_template_fields())
        
        # 测试获取特定模板
        theme_template = template_manager.get_template("theme_type")
        print("\n主题类型模板:")
        print(theme_template)
        
        # 测试获取不存在的模板（应返回默认模板）
        unknown_template = template_manager.get_template("unknown_field")
        print("\n未知字段模板（默认模板）:")
        print(unknown_template)
        
        # 测试模板验证
        test_vars = {
            "video_title": "测试视频",
            "video_description": "这是一个测试视频描述",
            "known_info": "已知信息测试"
        }
        is_valid = template_manager.validate_template(theme_template, test_vars)
        print(f"\n模板验证结果: {'有效' if is_valid else '无效'}")
        
        # 如果模板有效，测试格式化
        if is_valid:
            formatted_template = theme_template.format(**test_vars)
            print("\n格式化后的模板:")
            print(formatted_template)
            
    except Exception as e:
        print(f"测试出错: {e}")